package org.lab.tracecash.model;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.lab.tracecash.common.serialization.NotSerializable;

/**
 * Representacion de una entidad en la que podemos meter o sacar cash.
 * <p>
 * Puede ser una cuenta bancaria del mismo modo que puede ser utilizada para catalogar una categoria de gastos: por ejemplo podemos crear una cuenta llamada 'Alquiler' en la que
 * contabilicemos el dinero pagado por el alquier de un piso.
 * </p>
 * <p>
 * El modo de modificar el estado de la cuenta es mediante el objeto {@link Transaction}. Siguiendo el ejemplo anterior podemos tener una cuenta llamada 'Cuenta Corriente' y la
 * cuenta 'Alquiler'. Para reflejar el pago del alquiler generaremos una transaccion cuyo <i>source</i> sea la cuenta corriente y cuyo <i>target</i> sea la cuenta alquiler.
 * </p>
 */
@Entity
@Table(name = "tc_account")
@SuppressWarnings("serial")
public class Account implements Serializable {

	@Id
	@GeneratedValue
	@Column(name = "ID")
	private Long id;

	@Column(name = "NAME", length = 256, nullable = false)
	private String name;

	@ManyToOne
	@JoinColumn(name = "OWNER")
	@NotSerializable
	private User owner;

	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinColumn(name = "parent")
	@NotSerializable
	private Account parent;

	public Account() {
	}

	public Account(Long id, String name) {
		this.id = id;
		this.name = name;
	}

	public Account(String name, User owner) {
		this.name = name;
		this.owner = owner;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public User getOwner() {
		return owner;
	}

	public void setOwner(User owner) {
		this.owner = owner;
	}

	public Account getParent() {
		return parent;
	}

	public void setParent(Account parent) {
		this.parent = parent;
	}

	@Override
	public String toString() {
		return String.format("%s/%s", name, owner);
	}
}
